package com.dflc.config;

import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * mybatis-Plus自动填充功能
 *
 * @author libin
 * @version 1.0.0.0
 * <p>Title: MybatisMetaHandler </p>
 * Package: com.dflc.config
 * Company: dflc
 * Copyright: Copyright(c) 产品研发与安全部
 * Date: 2024年09月25日 14:36
 */
@Slf4j
@Component
public class MybatisMetaHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // 新建时间
        this.strictInsertFill(metaObject, "createTime",Date.class, new Date());
        // 更新时间
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
        try {
            StpUtil.checkLogin();
            String id = StpUtil.getLoginId().toString();
            if (!id.contains("wx-")){
                //是后台系统登陆则需要自动填充该创建人ID
                // 创建人ID
                this.strictInsertFill(metaObject, "createUserId", Integer.class, StpUtil.getLoginIdAsInt());

                this.strictUpdateFill(metaObject, "updateUserId", Integer.class, StpUtil.getLoginIdAsInt());
            }
        } catch (NotLoginException e) {
            // 处理未登录的情况，例如重定向到登录页面或返回未授权响应
            log.info("服务号绑定时候更新表，当前没有登陆需要直接更新");
            // Redirect or return unauthorized response
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        try {
            StpUtil.checkLogin();
            String id = StpUtil.getLoginId().toString();
            if (!id.contains("wx-")){
                //是后台系统登陆则需要自动填充该创建人ID
                this.setFieldValByName("updateTime", new Date(),metaObject);
                this.setFieldValByName( "updateUserId", StpUtil.getLoginIdAsInt(),metaObject);
            }
        } catch (NotLoginException e) {
            // 处理未登录的情况，例如重定向到登录页面或返回未授权响应
            log.info("服务号绑定时候更新表，当前没有登陆需要直接更新");
            // Redirect or return unauthorized response
        }
    }
}
